from django.db.models import Count, Q
from .models import Book, BorrowRecord

def generate_recommendations(user, num_recommendations=5):
    """
    为指定用户生成个性化书籍推荐。

    推荐逻辑:
    1. 找出用户最常借阅的作者。
    2. 找出评分最高的书籍。
    3. 结合以上两点，推荐用户没借过的、来自他喜欢作者的或其他高分书籍。
    """
    if not user.is_authenticated:
        return Book.objects.none()

    # 获取用户所有借过的书籍ID
    borrowed_books_ids = BorrowRecord.objects.filter(borrower=user).values_list('book__id', flat=True)

    # 如果用户没有借阅记录，推荐评分最高的书
    if not borrowed_books_ids.exists():
        return Book.objects.order_by('-average_rating')[:num_recommendations]

    # 1. 找出用户最常借阅的1-2位作者
    favorite_authors = list(
        Book.objects.filter(id__in=borrowed_books_ids)
        .values('author')
        .annotate(borrow_count=Count('author'))
        .order_by('-borrow_count')
        .values_list('author', flat=True)[:2]
    )

    # 2. 构建查询条件
    # 条件一：来自用户喜欢的作者
    q_favorite_authors = Q(author__in=favorite_authors)
    # 条件二：或者，是评分高于4星的高分书籍
    q_highly_rated = Q(average_rating__gte=4.0)

    # 组合查询，并排除用户已经借过的书
    recommendations = (
        Book.objects.filter(q_favorite_authors | q_highly_rated)
        .exclude(id__in=borrowed_books_ids)
        .distinct()
        .order_by('-average_rating') # 按评分排序，优先推荐好书
    )

    return recommendations[:num_recommendations]
